﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdbool.h>

//【代码0001-1】main函数的三种写法：
//第一种：也是最常用的
//int main()
//{		
//	return 0;
//}

//【代码0001-2】main函数的三种写法：
//void 的意思就是告诉你main函数没有参数
//int main(viod)
//{
//	return 0;
//}

//【代码0001-3】main函数的三种写法：
//main函数是可以有参数的，其参数是有特殊意义的；如果不想使用参数，可以不写；写了也可以不用，具体以后介绍；
//int main(int argc,char* argv[])
//{
//	return 0;
//}




//【代码0002】ASCII编码打印的深入理解：
//计算机中出现数字都是十进制的;
//计算机中十进制数字一但带了单引号或者双引号，就变为了字符或者字符串，对应的占位符为%c、%s，因为printf是按照指定格式打印；
//字符和对应的ASCII编码之间是可以相互转换打印的，但是，占位符必须匹配；
//int main()
//{
//	printf("%c\n",65);
//	//打印A；计算机中十进制数字0~127都是ASCII字符对应的编码，本行代码如果数字超出了这个范围，返回值就是错误的；
//	printf("%s\n", "65");
//	//打印65
//	printf("%c\n", 'A');
//	//打印A
//	printf("%c\n", 'A' + 32);
//	//打印a
//
//	printf("%d\n", 'A');
//	//打印65
//	printf("%d\n", 'A' + 32);
//	//打印97
//
//	printf("%d\n", '\n');
//	//打印10//虽然ASCII编码中0~31无法打印，但是有些符号可以反向打印出其对应的ASCII对应的编码，例如：转义字符：换行符“\n”
//	printf("%d\n", '\0');
//	//打印0//虽然ASCII编码中0~31无法打印，但是有些符号可以反向打印出其对应的ASCII对应的编码，例如：转义字符：字符串结束标志“\0”对应的ASCII编码是0
//	return 0;
// }




//【代码0003】可打印字符的展示：			
//int main()
//{
//	int i = 0;//在比较严谨的编译器中，变量的创建必须初始化，否则，会报错；
//	for (i = 32; i <= 127; i++)
//	//因为for函数后面还嵌入了一个函数块{}，所以，跟main()函数一样，for()后面没有分号；
//	//for函数里面是分号，不是逗号，这是与printf不同的地方;为什么？？？？？？？？？？？？？？？？？？？？？？
//	{
//		printf("%c ", i);
//	//%c后面是一个空格，因此打印出来的没有字符都是各一个空格
//	}
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	for (i = 32; i <= 127; i++)
//	{
//		printf("%c ", i);
//		if (i % 16 == 15)
//			//每16字符换行，即：16字符一行
//		{
//			printf("\n");
//		}
//	}
//	return 0;
//}




//【代码0004-1】字符串的两种打印格式，以及“监视”功能的演示
//int main()
//{
//	printf("hello Lucy\n");
//	printf("%s","hello Lucy\n");
//
//	printf("%s","abc\n");//监视：97'a'char    98'b'char    99'c'char    0'\0'char
//
//	printf("%s","a");//其实，字符还有一种打印格式，即：将单个字符当作字符串来处理；
//	return 0;
//}

//【代码0004-2】转义字符‘\0'的作用，以及“监视”功能的演示
//int main()
//{
//	char arr1[] = "abc";
//	char arr2[] = { 'a','b','c' };//这种相当于把多个字符放到数组里面，也属于字符串
//	char arr3[] = { 'a','b','c','\0'};
//
//	printf("%s\n", arr1);//打印：abc
//	printf("%s\n", arr2);//因为没有结束字符'\0'，所以打印错误，存在内存越界访问
//	printf("%s\n", arr3);//打印：abc
//
//	return 0;
//}

//【代码0004-3】strlen中结束标志\0的演示
//#include <string.h>
//int main()
//{
//	char arr1[] = { 'b', 'i', 't' };
//	char arr2[] = { 'b', 'i', 't' ,'\0'};
//
//	printf("%zd\n", strlen(arr1));//打印错误，在VS2022这种比较严谨的编译器中，越界访问现象会直接报错
//	printf("%zd\n", strlen(arr2));
//	//strlen的返回值类型是size_t,对应的占位符为%zd
//	return 0;
//}




//【代码0005-1】VS“监视”功能和\0的演示；
//int main()
//{
//	char arr1[] = { 'a','b','c' };//注意数组的书写格式;
//	char arr2[] = { 'a','b','c' ,'\0'};//注意数组的书写格式;
//	char arr3[] = "abc";
//
//	printf("%s\n", arr1);
//	//监视：97'a'char    98'b'char    99'c'char    0'\0'char
//	//打印：abc+随机字符
//	printf("%s\n", arr2);
//	//监视：97'a'char    98'b'char    99'c'char
//	//打印：abc
//	printf("%s\n", arr3);
//	//监视：97'a'char    98'b'char    99'c'char    0'\0'char
//	//打印：abc
//
//	return 0;
//}

//【代码0005-2】
//int main()
//{
//	int len1 = strlen("abc");//求一个字符串的长度;//string length
//	printf("%d\n", len1);//\0是字符串的结束标志，strlen在求字符串长度的时候，统计的是\0之前字符的个数
//
//	int len2 = strlen("c:\test\bit\113.c");//打印：12
//	printf("%d\n", len2);//
//
//	return 0;
//}



//【代码0006】转义字符的代码验证；
//int main()
//{
//	//printf("%s\n", "abcndfg");//换行符的对比
//	//printf("%s\n", "abc\ndfg");
//
//	/*什么是三字母符？
//	“？？）”--“]”
//	“？？（”--“[”*/
//	//printf("%s\n", "(are you ok ??)");//原来会打印出来：(are you ok ]
//	//printf("%s\n", "(are you ok \?\?)");//打印(are you ok ？？)
//
//	//printf("%c\n", '\'');//转义符\'的解析
//	//printf("%s\n", "\'");//转义符\'的解析
//
//	//printf("%c\n", '\"');//转义符\”的解析
//	//printf("%s\n", "\"");//转义符\”的解析
//
//	//printf("%s\n", "C:code\test\net\roub\class");//转义符"\\"的对比
//	//printf("%s\n", "C:code\\test\\net\\roub\\class");
//
//	//printf("%s\n", "\a");
//	//printf("%c\n", '\a');
//
//	//printf("%s\n", "a\bcdbef");//退格符的解析，在监视窗口就可以看到a并未未删除，只是隐藏了
//	//printf("%s\n", "abcdbef");
//
//	//printf("%s\n", "ab\rcdbef");//回车符的解析，在监视窗口就可以看到ab并未未删除，只是隐藏了
//	//printf("%s\n", "abcdbef");
//
//	printf("%s\n", "ab\tcdb\tef");//制表符的解析，在监视窗口就可以看到ab并未未删除，只是隐藏了
//
//	return 0;
//}


//【代码0007】特殊转义字符的代码验证
//int main()
//{
//	printf("%c\n", '\130');
//	printf("%s\n", "\130");
//
//	printf("%c\n", '\x30');
//	printf("%s\n", "\x30");
//
//	return 0;
//}




//【代码0008-1】布尔类型的两种代码演示
//int main()//该代码与下面代码实际上是同一个代码
//{
//	_Bool flag1 = true;
//	_Bool flag2 = false;
//	if (flag1) ;
//	if (flag2) ;
//	printf("I love CS.\n");
//	printf("I love CS.\n");
//
//	return 0;
//}

//【代码0008-2】布尔类型的两种代码演示
//int main()//该代码使用的是define声明的变量
//{
//	bool flag1 = 1;
//	bool flag2 = 0;
//	if (flag1) ;
//	if (flag2) ;
//	printf("I love CS.\n");
//	printf("I love CS.\n");
//
//	return 0;
//}




//【代码0009】strlen省略到括号的代码演示，以及VS2022声明size_t为llu的演示
//int main()
//{
//	int a = 0;
//	int b = 0;
//	printf("%zd\n", sizeof(int));//打印4
//	//int因为是类型必须加括号
//	printf("%zd\n", sizeof (a));//打印4
//	printf("%zd\n", sizeof a);//打印4
//	printf("%zd\n", sizeof a + b);//打印4
//	printf("%zd\n", sizeof 1);//打印4
//	//上面为变量、变量表达式、常量，因此加不加括号都可以
//
//	printf("%lf\n", sizeof 1+1.5);//打印5.5
//	//先计算sizeof 1，结果为4，然后计算4+1.5
//	//这是由操作符的有限顺序决定的，所以常量表达式得加括号
//	printf("%zd\n", sizeof(1 + 1));//打印4
//
//	printf("%llu\n", sizeof(int));
//	printf("%llu\n", sizeof(a));
//	printf("%llu\n", sizeof a);
//	printf("%llu\n", sizeof 0);
//	/*在VS2022IDE中，声明的size_t的返回值类型为64位，也就是8byte, 即：unsigned long long；
//	因此，在VS2022中，sizeof()的对应的占位符既可以是% zd, 也可以是llu%；*/
//	return 0;
//}




//【代码0010】sizeof()后边的表达式是不真实参与运算的
//int main()
//{
//	int a = 10;
//	short s = 4;
//	s = a + 20;
//	printf("%zd\n", sizeof(s = a + 5));//打印：1
//	printf("s=%d\n", s);//这行代码很高级，打印：字符串“s=”+变量s
//	printf("%d\n", s);//打印：30
//
//	return 0;
//}



//【代码0011】各数据类型的长度
//int main()
//{
//	printf("%zd\n", sizeof(bool));
//	printf("%zd\n", sizeof(char));
//	printf("%zd\n", sizeof(short));
//	printf("%zd\n", sizeof(int));
//	printf("%zd\n", sizeof(long));
//	printf("%zd\n", sizeof(long long));
//	printf("%zd\n", sizeof(float));
//	printf("%zd\n", sizeof(double));
//	printf("%zd\n", sizeof(long double));
//
//	return 0;
//}



//【代码0012】不需要初始化的举例
//int main()
//{
//	int a, b;
//	while (scanf("%d %d", &a, &b) != EOF)
//		printf("%d %d\n", a, b);
//
//	return 0;
//}




//【代码0013】
//int main()
//{
//	//int a = 10;
//	signed int a = 10;
//	printf("%d\n", a);//打印10
//	a = -20;
//	printf("%d\n", a);//打印-20
//	a = 0;
//	printf("%d\n", a);//打印0
//
//	return 0;
//}




//【代码0014-1】变量初始化的知识点验证
//int a1 = 100;
//int a2;
//int main()
//{
//	printf("%d\n", a1);//打印100
//	printf("%d\n", a2);//打印0
//	{
//		int a1 = 5;
//		int a2 = 6;
//
//		printf("%d\n", a1);//打印5
//		printf("%d\n", a2);//打印6
//		{
//			printf("%d\n", a1);//打印5
//			printf("%d\n", a2);//打印6
//
//		}
//	}
//	return 0;
//}

//【代码0014 - 2】变量初始化的知识点验证
//int main()
//{
//
//	printf("%d\n", a1);
//	printf("%d\n", a2);
//	{
//		printf("%d\n", a1);
//		printf("%d\n", a2);
//		{
//			printf("%d\n", a1);
//			printf("%d\n", a2);
//		}
//	}
//	return 0;
//}




//【代码0015】算数操作符+-*/的知识
//int main()
//{
//	int x = 4 + 22;
//	int y = x - 23;
//	int num = 5;
//	printf("%d\n", x);
//	printf("%d\n", y);
//	printf("%d\n", num*num);
//
//
//	float x1 = 6 / 4;
//	float x2 = 6 / 4.0;
//	float x3 = 6.0 / 4.0;
//	float x4 = 6.0 / 4;
//	int score1 = 5.0;
//	score1 = (score1 / 20) * 100;
//	int score2 = 5;
//	score2 = (score2 / 20.0) * 100;
//
//	printf("%f\n", x1);
//	printf("%f\n", x2);
//	printf("%f\n", x3);
//	printf("%f\n", x4);
//	printf("%d\n", score1);
//	printf("%d\n", score2);
//
//	return 0;
//}




//【代码0016】数据的打印类型不匹配会发生截断
//int main()
//{
//    int a = 3.5;
//    printf("%d\n", a);//打印：3
//
//    return 0;
//}




//【代码0017】负数求模规则
//int main()
//{
//	printf("%d\n", 11 % -5); // 1
//	printf("%d\n", -11 % -5); // -1
//	printf("%d\n", -11 % 5); // -1
//	return 0;
//}




//【代码0018-1】赋值及复合赋值
//int main()
//{
//	int num = 100;//创建变量的同时给一个初始值，这叫初始化
//	printf("%d\n",num);
//	
//	num= 3;//赋值
//	printf("%d\n", num);
//		
//    int a = 3;
//	int b = 5;
//	int c = 0;
//	c = b = a + 3;//连续赋值，从右向左依次赋值的。
//	
//	printf("%d\n%d\n", b, c);
//
//	return 0;
//}

//【代码0018 - 2】赋值及复合赋值
//int main()
//{
//	int a = 10;
//	printf("%d\n", a);//打印10
//	a = a + 3;
//	printf("%d\n", a);//打印13
//	a = a - 2;
//	printf("%d\n", a);//打印11
//	a = a * 2;
//	printf("%d\n", a);//打印22
//	a = a / 2;
//	printf("%d\n", a);//打印11
//	return 0;
//}

//【代码0018 - 3】赋值及复合赋值
//int main()
//{
//	int a = 10;
//	printf("%d\n", a);//打印10
//	a +=3;
//	printf("%d\n", a);//打印13
//	a -=2;
//	printf("%d\n", a);//打印11
//	a *=2;
//	printf("%d\n", a);//打印22
//	a /=2;
//	printf("%d\n", a);//打印11
//
//	return 0;
//}



//【代码0019-1】单目操作符
//int main()
//{
//	int a = 5;
//	a = a + 1;
//	a += 1;
//	a++;
//	++a;
//	printf("%d\n", a);
//	return 0;
//}

//【代码0019-2】单目操作符
//int main()
//{
//	int a = 10;
//	int b = ++a;//前置++
//	//a=a+1, b=a;
//	//计算口诀：先+1，后使用；
//
//	printf("a=%d\n", a);//11
//	printf("b=%d\n", b);//11
//
//	return 0;
//}

//【代码0019-3】单目操作符
//int main()
//{
//	int a = 10;
//	int b = a++;//后置++
//	//b=a, a=a+1;
//	//计算口诀：先使用，后+1
//
//	printf("a=%d\n", a);//11
//	printf("b=%d\n", b);//10
//
//	return 0;
//}

//【代码0019-4】单目操作符
//int main()
//{
//	int a = 10;
//	printf("%d\n", a++);//10
//	printf("%d\n", a);//11
//	return 0;
//}

//【代码0019-5】单目操作符
//int main()
//{
//	int a = 10;
//	printf("%d\n", ++a);//11
//	printf("%d\n", a);//11
//	return 0;
//}




//【代码0020】强制转换符案例
//int main()
//{
//	int a = (int)3.14;
//	int b = (int)3.46;
//	printf("%d\n", a);//打印3
//	printf("%d\n", b);//打印3，不会四舍五入
//	return 0;
//}




//【代码0021】
//int main()
//{
//	printf("hello world\n");
//	printf("hello\nworld\n");
//	printf("there are 3 apples\n");
//	printf("there are %d apples\n", 3);
//	printf("there are %d apples\n", 5);
//
//	printf("zhangsan will come tonight\n");
//	printf("%s will come tonight\n", "张三");
//	printf("%s will come tonight\n", "lisi");
//
//	printf("%s说：现在是 %d 点\n", "翠花", 12);
//	int num = 10;
//	printf("%d\n", num);
//
//	return 0;
//	}




//【代码0022】printf的限定最小宽度
//int main()
//{
//    printf("%d\n", 123); 
//    printf("%5d\n", 123);//右对齐；//打印：“  123”
//    printf("%5d\n", 1234567);//右对齐；//打印：“1234567”
//    printf("%-5dhehe\n", 123);//左对齐；//打印：“123  hehe”
//
//    printf("%12f\n", 123.45);//小数点算一个位数；打印：“  123.450000”
//	return 0;
//}




//【代码0023】printf的限定小数位数
//int main()
//{
//	printf("Number is %.2f\n", 5.2678);//打印：5.27
//	return 0;
//}



//【代码0024】
//int main()
//{
//    printf("%*.*f\n", 6,2,123456.5);//打印：123456.50
//    return 0;
//}




//【代码0025】
//int main()
//{
//	printf("请输入您的考试成绩：\n");
//	int sorce = 0;
//	scanf("%d", &sorce);//&提供的是地址；
//	printf("成绩是：%d\n", sorce);
//	return 0;
//}




//【代码0026】scanf对空白字符的过滤案例
//int main()
//{
//	int i = 0;
//	int j = 0;
//	float x = 0.0f;
//	float y = 0.0f;
//
//	scanf("%d%d%f%f", &i, &j, &x, &y);//可以⼀次将键盘输⼊读⼊多个变量:"1 -20 3.4 -4.0e3";
//
//	printf("i = %d\n", i);
//	printf("j = %d\n", j);
//	printf("x = %f\n", x);
//	printf("y = %f\n", y);
//
//	return 0;
//}




//【代码0027】
//int main()
//{
//	char ch1 = '0';
//	char ch2[6];
//	int a = 0;
//	int b = 0;
//	int c = 0;
//
//	scanf(" %c%s%d%d%d", &ch1, &ch2,&a, &b, &c);
//	//本次输入“   a cdef 10 20 30”
//	printf("ch=% c\n", ch1);//上述输入里面开头有空格，因此% c中间加了个空格；
//	printf("ch=%s\n", ch2);
//	printf("ch=%d\n", a);
//	printf("ch=%d\n", b);
//	printf("ch=%d\n", c);
//
//	return 0;
//}




//【代码0028】
//int main()
//{
//	char arr1[6] = { 0 };//abc\0
//	char arr2[6] = { 0 };//def\0
//	//本次输入包含非首空格字符，最多只能输入9个字节，因为scanf末尾还隐藏了一个\0，输入“  abcde  fghjk”
//	scanf("%s%s", arr1, arr2);
//	//输入1“   a bc  def”；输入2“   abc  def”；
//	printf("%s\n", arr1);//打印1：a   打印2：bc
//	printf("%s\n", arr2);//打印1：bc  打印2：def
//
//	return 0;
//}




//【代码0029】
//int main()
//{
//	char arr[6] = { 0 };
//	scanf("%5s", arr);//输入≥5个字符的时候，只会读取5个字符；
//	printf("%s\n", arr);
//
//	return 0;
//}
//




//【代码0030-1】
// 
//int main()
//{
//    int x;
//    float y;
//
//    // 用户输入 "    -13.45e12# 0"
//    //0.45*10^12
//    scanf("%d", &x);
//    printf("%d\n", x);
//    scanf("%f", &y);
//    //0.449999994880
//    printf("%f\n", y);
//    return 0;
//}

//【代码0030 - 2】
//int main()
//{
//    int x;
//    float y;
//
//    scanf("%d%f", &x,&y);
//    printf("%d\n%f", x,y);
//
//    return 0;
//}




// 【代码0031-1】  
//以下分三种情况：
//1、输入："10 20 30"
//2、输入："10 20 Z"
//3、输入："随便乱码”
//int main()
//{
//	int a=0;
//	int b = 0;
//	int c = 0;
//	int net =scanf("%d%d%d%", &a, &b, &c);
//	printf("a=%d\nb=%d\nc=%d\nnet=%d", a, b, c,net);
//
//    return 0;
//}

// 【代码0031-2】EOF的运用
//int main()
//{
//	int a, b;
//	while (scanf("%d %d", &a, &b) != EOF)
//		printf("a=%d\nb=%d", a, b);
//
//	return 0;
//}

// 【代码0031-3】#define EOF (-1)
//int main()
//{
//	int a, b;
//	while (scanf("%d %d", &a, &b) != -1)
//		printf("a=%d\nb=%d", a, b);
//
//	return 0;
//}

// 【代码0031-4】scanf()如果匹配失败，则返回0
//int main()
//{
//	int a, b;
//	while (scanf("%d %d", &a, &b) != 0)
//	//因为scanf对输入的值的个数没有限制，未读取完的值，会从上⼀次解读遗留的第⼀个字符开始，直到读完缓存，或者遇到第⼀个不符合条件的字符为⽌
//	//输入：12 13 14 15 16 17 18 19 20 21 22 23 22
//		printf("a=%d\nb=%d\n", a, b);
//
//	return 0;
//}

//【代码0031-5】
//int main()
//{
//	int a = 0;
//	int b = 0;
//	while (scanf("%d %d", &a, &b) == 2)
//	{
//		int c = a + b;
//		printf("%d", c);
//	}
//
//	return 0;
//}




//【0032】
//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//
//	scanf("%d-%d-%d", &year, &month, &day);
//	2023-11-22
//	scanf("%d%*c%d%*c%d", &year, &month, &day);
//	printf("%d %d %d\n", year, month, day);
//	return 0;
//}

